﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class FaceClient
    {
        private string APP_ID = "16828959";
        private string API_KEY = "fGNVpH6ZIL62C9x6Q4rBDZSv";
        private string SECRET_KEY = "MlnDBdzD28ZebAgYv5aSLAMGVLrdMWgC";

        // 图片类型:
        // 1. **BASE64**:图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M；
        // 2. **URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长)**
        private readonly string IMAGETYPE = "BASE64";
        private Baidu.Aip.Face.Face client = null;

        public FaceClient()
        {
            this.client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY);
            this.client.Timeout = 60000;  // 修改超时时间
        }

        public FaceClient(string appid, string apikey, string secretkey) : this()
        {
            this.APP_ID = appid;
            this.API_KEY = apikey;
            this.SECRET_KEY = secretkey;
        }

        /// <summary>
        /// 人脸注册
        /// </summary>
        /// <param name="image">图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M</param>
        /// <param name="groupId">用户组id（由数字、字母、下划线组成），长度限制128B</param>
        /// <param name="userId">用户id（由数字、字母、下划线组成），长度限制128B</param>
        /// <param name="userinfo">用户资料，长度限制256B</param>
        public Newtonsoft.Json.Linq.JObject UserAdd(string image, string groupId, string userId, string userinfo)
        {
            var options = new Dictionary<string, object>{
                {"user_info", userinfo},
                {"quality_control", "NORMAL"},
                {"liveness_control", "LOW"},
                {"action_type", "REPLACE"}
            };
            var result = this.client.UserAdd(image, this.IMAGETYPE, groupId, userId, options);
            return result;
        }

        /// <summary>
        /// 人脸更新
        /// </summary>
        /// <param name="image">图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M</param>
        /// <param name="groupId">用户组id（由数字、字母、下划线组成），长度限制128B</param>
        /// <param name="userId">用户id（由数字、字母、下划线组成），长度限制128B</param>
        /// <param name="userinfo">用户资料，长度限制256B</param>
        public Newtonsoft.Json.Linq.JObject UserUpdate(string image, string groupId, string userId, string userinfo)
        {
            var options = new Dictionary<string, object>{
                {"user_info", userinfo},
                {"quality_control", "NORMAL"},
                {"liveness_control", "LOW"},
                {"action_type", "REPLACE"}
            };
            var result = this.client.UserUpdate(image, this.IMAGETYPE, groupId, userId, options);
            return result;
        }

        /// <summary>
        /// 用户信息查询
        /// </summary>
        /// <param name="groupId">用户组id（由数字、字母、下划线组成），长度限制128B</param>
        /// <param name="userId">用户id（由数字、字母、下划线组成），长度限制128B</param>
        public Newtonsoft.Json.Linq.JObject UserGet(string groupId, string userId)
        {
            var result = this.client.UserGet(userId, groupId);
            return result;
        }

        /// <summary>
        /// 人脸检测：检测图片中的人脸并标记出位置信息;
        /// </summary>
        /// <param name="image">图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M</param>
        public Newtonsoft.Json.Linq.JObject Detect(string image)
        {
            // 调用人脸检测，可能会抛出网络等异常，请使用try/catch捕获// 如果有可选参数
            var options = new Dictionary<string, object>{
                {"face_field", "age"},
                {"max_face_num", 10},
                {"face_type", "LIVE"},
                {"liveness_control", "LOW"}
            };

            // 带参数调用人脸检测
            var result = this.client.Detect(image, this.IMAGETYPE, options);
            return result;
        }

        /// <summary>
        /// 1：N人脸搜索：也称为1：N识别，在指定人脸集合中，找到最相似的人脸；
        /// </summary>
        /// <param name="image">图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M</param>
        /// <param name="groupIdList">用户组id(多个以,隔开)</param>
        public Newtonsoft.Json.Linq.JObject Search(string image, string groupIdList)
        {
            // 调用人脸搜索，可能会抛出网络等异常，请使用try/catch捕获
            var result = this.client.Search(image, this.IMAGETYPE, groupIdList);
            return result;
        }

        /// <summary>
        /// 人脸搜索 M:N 识别
        /// </summary>
        /// <param name="image">图片的base64值，base64编码后的图片数据，需urlencode，编码后的图片大小不超过2M</param>
        /// <param name="groupIdList">用户组id(多个以,隔开)</param>
        public Newtonsoft.Json.Linq.JObject MultiSearch(string image, string groupIdList)
        {
            // 调用人脸搜索 M:N 识别，可能会抛出网络等异常，请使用try/catch捕获
            // 如果有可选参数
            var options = new Dictionary<string, object>{
                {"max_face_num", 10},
                {"match_threshold", 80},
                {"quality_control", "NONE"},
                {"liveness_control", "NONE"},
                {"max_user_num", 10}
            };

            // 带参数调用人脸搜索 M:N 识别
            var result = this.client.MultiSearch(image, this.IMAGETYPE, groupIdList, options);
            return result;
        }
    }
}
